<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/9/7
 * Time: 15:31
 */

namespace app\api\service;

use app\api\model\Product as ProductModel;
use app\lib\enum\OrderStatusEnum;
use think\Db;
use think\Exception;
use think\Loader;
use app\api\model\Order as OrderModel;
use think\Log;

Loader::import('WxPay',EXTEND_PATH,'.Api.php');
class WxNotify extends \WxPayNotify
{

    /*<xml>
      <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
      <attach><![CDATA[支付测试]]></attach>
      <bank_type><![CDATA[CFT]]></bank_type>
      <fee_type><![CDATA[CNY]]></fee_type>
      <is_subscribe><![CDATA[Y]]></is_subscribe>
      <mch_id><![CDATA[10000100]]></mch_id>
      <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
      <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
      <out_trade_no><![CDATA[1409811653]]></out_trade_no>
      <result_code><![CDATA[SUCCESS]]></result_code>
      <return_code><![CDATA[SUCCESS]]></return_code>
      <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
      <sub_mch_id><![CDATA[10000100]]></sub_mch_id>
      <time_end><![CDATA[20140903131540]]></time_end>
      <total_fee>1</total_fee>
    <coupon_fee><![CDATA[10]]></coupon_fee>
    <coupon_count><![CDATA[1]]></coupon_count>
    <coupon_type><![CDATA[CASH]]></coupon_type>
    <coupon_id><![CDATA[10000]]></coupon_id>
    <coupon_fee><![CDATA[100]]></coupon_fee>
      <trade_type><![CDATA[JSAPI]]></trade_type>
      <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
    </xml>*/
    //微信接口地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7
    public function NotifyProcess($objData, $config, &$msg)
    {
        if ($objData['result_code'] == 'SUCCESS')
        {
            $orderNo = $objData['out_trade_no'];
            Db::startTrans();
            try{
                $order = OrderModel::where('order_no','=',$orderNo)
                    ->find();
                if ($order->status == 1){
                     //库存量检测
                    $service = new Order();
                    //订单库存量状态
                    $stockStatus = $service->checkOrderStock($order->id);
                    if ($stockStatus['pass']){
                        //更新订单状态
                        $this->updateOrderStatus($order->id,true);
                        //消减库存
                        $this->reduceStock($stockStatus);
                    }else{
                        //更新订单状态
                        $this->updateOrderStatus($order->id,false);
                    }
                    Db::commit();
                    return true;
                }
            }catch (Exception $ex){
                Db::rollback();
                Log::error($ex);
                return false;
            }
        }else{
            return true;
        }
    }

    //订单状态更新
    private function updateOrderStatus($orderId,$success){
        $status = $success?OrderStatusEnum::PAID : OrderStatusEnum::PAID_BUT_OUT_OF;
        OrderModel::where('id','=',$orderId)
            ->update(['status'=>$status]);
    }

    //消减库存
    private function reduceStock($stockStasus)
    {
        foreach ($stockStasus['pStatusArray'] as $singlePSstatus)
        {
            ProductModel::where('id','=',$singlePSstatus['id'])
                ->setDec('stock',$stockStasus['count']);
        }
    }
}